#include "checkinrecordqueryform.h"
#include "ui_checkinrecordqueryform.h"
#include "httpmanager.h"
#include <QMessageBox>
#include <QJsonArray>
#include <QProgressDialog>
#include <QDebug>
#include <QPointer>  // 引入QPointer头文件

CheckInRecordQueryForm::CheckInRecordQueryForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::CheckInRecordQueryForm),
    m_model(new QStandardItemModel(this))
{
    ui->setupUi(this);

    initTable();  // 初始化表格
}

CheckInRecordQueryForm::~CheckInRecordQueryForm()
{
    delete ui;
}

void CheckInRecordQueryForm::initTable()
{
    // 增加空指针检查，确保tableView有效
    if (!ui->tableView) {
        qDebug() << "错误：tableView未初始化";
        return;
    }

    // 设置列数和列名
    m_model->setColumnCount(7);
    m_model->setHeaderData(0, Qt::Horizontal, "签到日期");
    m_model->setHeaderData(1, Qt::Horizontal, "签到时间");
    m_model->setHeaderData(2, Qt::Horizontal, "迟到时长");
    m_model->setHeaderData(3, Qt::Horizontal, "签到状态");
    m_model->setHeaderData(4, Qt::Horizontal, "签退时间");
    m_model->setHeaderData(5, Qt::Horizontal, "早退时长");
    m_model->setHeaderData(6, Qt::Horizontal, "签退状态");

    // 关联模型到表格
    ui->tableView->setModel(m_model);

    // 设置表格属性
    ui->tableView->horizontalHeader()->setStretchLastSection(true);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

// 填充表格数据（增强JSON解析健壮性）
void CheckInRecordQueryForm::fillTable(const QJsonArray &records)
{
    if (!ui->tableView) {  // 检查UI组件有效性
        qDebug() << "错误：tableView为空，无法填充数据";
        return;
    }

    m_model->removeRows(0, m_model->rowCount());  // 清空现有数据

    for (int i = 0; i < records.size(); ++i) {
        if (!records[i].isObject()) {  // 检查JSON类型
            qDebug() << "警告：第" << i << "条记录不是JSON对象";
            continue;
        }
        QJsonObject record = records[i].toObject();

        // 安全获取JSON字段（增加类型检查）
        QString checkinDate = record.contains("recordDate") && record["recordDate"].isString()
                ? record["recordDate"].toString()
                : "未知日期";

        QString signInTime = record.contains("signInTime") && record["signInTime"].isString()
                ? record["signInTime"].toString()
                : "";

        QString signOutTime = record.contains("signOutTime") && record["signOutTime"].isString()
                ? record["signOutTime"].toString()
                : "";

        int lateMinutes = record.contains("lateMinutes") && record["lateMinutes"].isDouble()
                ? record["lateMinutes"].toInt()
                : 0;

        QString signInStatus = record.contains("signInStatus") && record["signInStatus"].isString()
                ? record["signInStatus"].toString()
                : "未知";

        int earlyMinutes = record.contains("earlyMinutes") && record["earlyMinutes"].isDouble()
                ? record["earlyMinutes"].toInt()
                : 0;

        QString signOutStatus = record.contains("signOutStatus") && record["signOutStatus"].isString()
                ? record["signOutStatus"].toString()
                : "未知";

        // 签到时间处理
        QString checkinHour;
        if (signInTime.isEmpty()) {
            checkinHour = "未签到";
        } else {
            checkinHour = (signInTime.length() >= 19) ? signInTime.mid(11, 8) : signInTime;
        }

        // 签退时间处理
        QString checkoutHour;
        if (signOutTime.isEmpty()) {
            checkoutHour = "未签退";
        } else {
            checkoutHour = (signOutTime.length() >= 19) ? signOutTime.mid(11, 8) : signOutTime;
        }

        // 创建表格行项
        QList<QStandardItem*> rowItems;
        rowItems.append(new QStandardItem(checkinDate));
        rowItems.append(new QStandardItem(checkinHour));
        rowItems.append(new QStandardItem(QString::number(lateMinutes) + "分钟"));
        rowItems.append(new QStandardItem(signInStatus));
        rowItems.append(new QStandardItem(checkoutHour));
        rowItems.append(new QStandardItem(QString::number(earlyMinutes) + "分钟"));
        rowItems.append(new QStandardItem(signOutStatus));

        // 设置所有项不可编辑
        foreach (QStandardItem* item, rowItems) {
            item->setEditable(false);
        }

        m_model->appendRow(rowItems);
    }
}

void CheckInRecordQueryForm::on_pushButton_clicked()
{
    // 获取UI输入的查询参数
    QString empId = ui->lineEdit->text().trimmed();

    // 输入校验
    if (empId.isEmpty()) {
        QMessageBox::warning(this, "输入错误", "员工ID不能为空");
        return;
    }

    // 显示加载提示
    QProgressDialog *loading = new QProgressDialog("正在查询考勤记录...", "取消", 0, 0, this);
    loading->setWindowTitle("处理中");
    loading->setWindowModality(Qt::WindowModal);
    loading->show();

    // 使用QPointer包装this指针，避免悬空指针
    QPointer<CheckInRecordQueryForm> self(this);

    // 构建请求参数
    QMap<QString, QString> params;
    params["employee_id"] = empId;

    // 发送GET请求
    HttpManager::instance()->get(
                QString(SERVER_BASE_URL) + "/api/attend/by_employee_id",
                params,
                // 成功回调
                [self, loading](const QJsonObject& result) {
        // 先处理加载对话框
        loading->close();
        delete loading;

        // 检查窗口是否已销毁
        if (!self) {
            return;
        }

        if (result["success"].toBool()) {
            QJsonArray records = result["data"].toArray();
            self->fillTable(records);  // 使用self->调用成员函数

            // 更新label_2显示查询结果
            QString resultText;
            if (records.isEmpty()) {
                resultText = "未找到符合条件的考勤记录";
            } else {
                resultText = QString("共查询到 %1 条记录").arg(records.size());
            }
            self->ui->label_2->setText(resultText);  // 显示到label_2

            // 显示消息框
            QMessageBox::information(self, "查询结果", resultText);
        } else {
            QString errorMsg = result.contains("error") ?
                        result["error"].toString() : "查询失败，请重试";
            self->ui->label_2->setText("查询失败：" + errorMsg);  // 错误信息显示到label_2
            QMessageBox::warning(self, "查询失败", errorMsg);
        }
    },
    // 错误回调
    [self, loading](int code, const QString& msg) {
        // 先处理加载对话框
        loading->close();
        delete loading;

        // 检查窗口是否已销毁
        if (!self) {
            return;
        }

        QString errorText = QString("网络错误：错误码%1，%2").arg(code).arg(msg);
        self->ui->label_2->setText(errorText);  // 网络错误显示到label_2
        QMessageBox::critical(self, "网络错误", errorText);
    }
    );
}
